package escaleras.pkginterface;

import Dominio.Entidades.ArchivoGrabacion;
import Dominio.Entidades.Celda;
import Dominio.Entidades.Coordenada;
import Dominio.Entidades.Jugada;
import Dominio.Entidades.Pieza;
import Dominio.Entidades.TipoPieza;
import static Dominio.Entidades.TipoPieza.Ficha;
import Dominio.Fachada.Escalera;
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Component;
import java.awt.Dimension;
import java.awt.GridLayout;
import java.awt.Insets;
import java.awt.Label;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.io.File;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Collections;

import java.util.GregorianCalendar;

import javax.swing.ButtonGroup;
import javax.swing.Icon;
import javax.swing.JButton;
import javax.swing.JFileChooser;
import javax.swing.JLabel;
import javax.swing.JOptionPane;

import javax.swing.JRadioButton;
import javax.swing.SwingConstants;

import javax.swing.filechooser.FileNameExtensionFilter;

public class Partidas extends javax.swing.JInternalFrame {

    private Escalera sistemaEscalera;
    private String saltoLinea = "\n";
    private int tamanioBotones = 75;
    private int dimension = 4;
    private Color escalaGris = new Color(244, 242, 240);
    private Color escalaRojo = new Color(255, 102, 102);//[255,102,102]
    private JButton[][] botonesTablero;
    private JButton botonesCuadrado;
    private JButton[][] botonesRectangulo;
    private JButton[][] botonesLadrilloL;
    private Pieza piezaSeleccionada = null;
    private Pieza fichaEnTablero = null;
    private Coordenada[] rotacionR = {new Coordenada(0, 0), new Coordenada(0, 1)};
    private Coordenada[] rotacionL = {new Coordenada(0, 0), new Coordenada(1, 0), new Coordenada(1, 1)};
    private ArrayList<Coordenada> listaMovimientos = null;
    private Icon iconoFichaBlanca = new javax.swing.ImageIcon(getClass().getResource("/escaleras/pkginterface/Recursos/Ficha_Blanca_45x45.png"));
    private Icon iconoFichaNegra = new javax.swing.ImageIcon(getClass().getResource("/escaleras/pkginterface/Recursos/Ficha_Negra_45x45.png"));
    private Icon iconoConector = new javax.swing.ImageIcon(getClass().getResource("/escaleras/pkginterface/Recursos/Conector.png"));
    private Icon iconoConectorBottom = new javax.swing.ImageIcon(getClass().getResource("/escaleras/pkginterface/Recursos/ConectorBottom.png"));
    private Icon iconoConectorTop = new javax.swing.ImageIcon(getClass().getResource("/escaleras/pkginterface/Recursos/ConectorTop.png"));
    private Icon iconoConectorLeft = new javax.swing.ImageIcon(getClass().getResource("/escaleras/pkginterface/Recursos/ConectorLeft.png"));
    private Icon iconoConectorRight = new javax.swing.ImageIcon(getClass().getResource("/escaleras/pkginterface/Recursos/ConectorRight.png"));
    private Icon iconoConectorBottomLeft = new javax.swing.ImageIcon(getClass().getResource("/escaleras/pkginterface/Recursos/ConectorBottomLeft.png"));
    private Icon iconoConectorBottomRight = new javax.swing.ImageIcon(getClass().getResource("/escaleras/pkginterface/Recursos/ConectorBottomRight.png"));
    private Icon iconoConectorTopRight = new javax.swing.ImageIcon(getClass().getResource("/escaleras/pkginterface/Recursos/ConectorTopRight.png"));
    private Icon iconoConectorTopLeft = new javax.swing.ImageIcon(getClass().getResource("/escaleras/pkginterface/Recursos/ConectorTopLeft.png"));
    private boolean blancaIngresada = false;
    private boolean negraIngresada = false;
    private Calendar horaComienzo = new GregorianCalendar().getInstance();
    private boolean finalizo = false;
    private int tamañoLista;

    /**
     *
     * @param pSisEscalera
     * @param pDimensionT
     * @param pMinutos
     */
    public Partidas(Escalera pSisEscalera, int pDimensionT, int pMinutos) {
        initComponents();
        try {
            horaComienzo.add(Calendar.MINUTE, pMinutos);
            sistemaEscalera = pSisEscalera;
            dimension = pDimensionT;
            dibujarColumnas();
            dibujarFilas();
            dibujarTablero();
            dibujarFicha();
            JRadioButton[] radios = {getRDBFicha(), getRDBCuadrado(), getRDBRectangulo(), getRDBLadrilloL()};
            getButtonGroupPiezas(radios);
            panelAccionesFicha.setVisible(false);
            lstJugadas.setBounds(lstJugadas.getX(), lstJugadas.getY(), 200 + (tamanioBotones * dimension), lstJugadas.getHeight() + 10);
            ShapedButtonUI roundUIRotar = new ShapedButtonUI();
            roundUIRotar.setShape(ShapedButtonUI.ButtonShape.ROUND, btnRotar, Color.WHITE, new Color(104, 120, 126), Color.BLACK);
            btnRotar.setUI(roundUIRotar);
            btnRotar.setSize(new Dimension(80, 80));
            btnRotar.setBorderPainted(false);
            btnRotar.addActionListener(new java.awt.event.ActionListener() {
                public void actionPerformed(java.awt.event.ActionEvent evt) {
                    btnRotarActionPerformed();
                }
            });

            btnRotar.setEnabled(!finalizo);
            listarJugada();

            Reloj reloj = new Reloj(dimension * tamanioBotones + 20, 5, 203, 21);//Instancia de nuestra clase Reloj 
            //(0,0,0,0 ya que el layout es x defecto) 
            //Sino aquí es donde dan locación y tamaño 
            reloj.setHorizontalAlignment(javax.swing.SwingConstants.CENTER);//Centrado del texto 
            reloj.setFont(new java.awt.Font("Arial Black", 2, 14));//font	Arial Black 14 Italic 
            //this.getContentPane().add(reloj);//Agregado del reloj 
            this.add(reloj);
        } catch (Exception ex) {
            JOptionPane.showMessageDialog(null, ex.getMessage(), "Error en la Partida", JOptionPane.ERROR_MESSAGE);
        }
    }

    /**
     *
     * @return
     */
    private JRadioButton getRDBRetirar() {
        try {
            rdbRetirar.setEnabled(sistemaEscalera.getPartida().ultimaJugadaDeSuFicha(sistemaEscalera.getPartida().turnoJugador()).isIngresa());
            rdbRetirar.setSelected(false);
            rdbRetirar.setText("Retirar");

        } catch (Exception ex) {
            JOptionPane.showMessageDialog(null, ex.getMessage(), "Error en la Partida", JOptionPane.ERROR_MESSAGE);
        }
        return rdbRetirar;
    }

    /**
     *
     * @return
     */
    private JRadioButton getRDBMover() {
        try {
            rdbMover.setEnabled(sistemaEscalera.getPartida().ultimaJugadaDeSuFicha(sistemaEscalera.getPartida().turnoJugador()).isIngresa());
            rdbMover.setSelected(false);
            rdbMover.setText("Mover");

        } catch (Exception ex) {
            JOptionPane.showMessageDialog(null, ex.getMessage(), "Error en la Partida", JOptionPane.ERROR_MESSAGE);
        }
        return rdbMover;
    }

    /**
     * Creación del grupo de botones recibe nuestro radiobutton creados
     * anteriormente
     *
     * @param radio1
     */
    private void getButtonGroupAccionesFicha(JRadioButton[] radio1) {
        //creamos el objeto
        ButtonGroup bgroup = new ButtonGroup();
        if (radio1 != null) {
            for (int btn = 0; btn < radio1.length; btn++) {
                //añadimos al grupo el radioButton
                bgroup.add(radio1[btn]);
            }
        }
    }

    /**
     *
     * @return
     */
    private JRadioButton getRDBFicha() {
        try {
            if (sistemaEscalera.getPartida().tieneDisponibleIngresarPieza(TipoPieza.Ficha)) {
                rdbFicha.setEnabled(true);
                piezaSeleccionada = new Pieza(TipoPieza.Ficha, rotacionL);
                rdbFicha.setSelected(true);
                rdbFicha.setText("Ficha");
                //rdbCuadrado.setBounds(80, 100, 20, 20);
                rdbFicha.addActionListener(new java.awt.event.ActionListener() {
                    public void actionPerformed(java.awt.event.ActionEvent evt) {
                        try {
                            //rotarPieza();
                            dibujarFicha();
                            btnRotar.setEnabled(false);
                            piezaSeleccionada = new Pieza(TipoPieza.Ficha, rotacionL);

                        } catch (Exception ex) {
                            JOptionPane.showMessageDialog(null, ex.getMessage(), "Error en la Partida", JOptionPane.ERROR_MESSAGE);
                        }
                    }
                });
            } else {
                rdbFicha.setEnabled(false);
                rdbFicha.setText("Ficha");
                //rdbCuadrado.setBounds(80, 100, 20, 20);
                rdbFicha.addActionListener(new java.awt.event.ActionListener() {
                    public void actionPerformed(java.awt.event.ActionEvent evt) {
                        try {
                            //rotarPieza();
                            dibujarFicha();
                            btnRotar.setEnabled(false);
                            piezaSeleccionada = new Pieza(TipoPieza.Ficha, rotacionL);

                        } catch (Exception ex) {
                            JOptionPane.showMessageDialog(null, ex.getMessage(), "Error en la Partida", JOptionPane.ERROR_MESSAGE);
                        }
                    }
                });
            }
        } catch (Exception ex) {
            JOptionPane.showMessageDialog(null, ex.getMessage(), "Error en la Partida", JOptionPane.ERROR_MESSAGE);
        }
        return rdbFicha;
    }

    /**
     *
     * @return
     */
    private JRadioButton getRDBCuadrado() {
        try {
            if (sistemaEscalera.getPartida().tieneDisponibleIngresarPieza(TipoPieza.Cuadrado)) {
                rdbCuadrado.setEnabled(true);
                rdbCuadrado.setSelected(true);
                rdbCuadrado.setText("Cuadrado");
                //rdbCuadrado.setBounds(80, 100, 20, 20);
                rdbCuadrado.addActionListener(new java.awt.event.ActionListener() {
                    public void actionPerformed(java.awt.event.ActionEvent evt) {
                        try {
                            //rotarPieza();
                            dibujarCuadrado();
                            btnRotar.setEnabled(true);
                            Coordenada[] coordenada = {new Coordenada(0, 0)};
                            piezaSeleccionada = new Pieza(TipoPieza.Cuadrado, coordenada);

                        } catch (Exception ex) {
                            JOptionPane.showMessageDialog(null, ex.getMessage(), "Error en la Partida", JOptionPane.ERROR_MESSAGE);
                        }
                    }
                });
            } else {
                rdbCuadrado.setEnabled(false);
                rdbCuadrado.setSelected(true);
                rdbCuadrado.setText("Cuadrado");
                //rdbCuadrado.setBounds(80, 100, 20, 20);
                rdbCuadrado.addActionListener(new java.awt.event.ActionListener() {
                    public void actionPerformed(java.awt.event.ActionEvent evt) {
                        try {
                            //rotarPieza();
                            dibujarCuadrado();
                            btnRotar.setEnabled(true);
                            Coordenada[] coordenada = {new Coordenada(0, 0)};
                            piezaSeleccionada = new Pieza(TipoPieza.Cuadrado, coordenada);

                        } catch (Exception ex) {
                            JOptionPane.showMessageDialog(null, ex.getMessage(), "Error en la Partida", JOptionPane.ERROR_MESSAGE);
                        }
                    }
                });
            }
        } catch (Exception ex) {
            JOptionPane.showMessageDialog(null, ex.getMessage(), "Error en la Partida", JOptionPane.ERROR_MESSAGE);
        }
        return rdbCuadrado;
    }

    /**
     *
     * @return
     */
    private JRadioButton getRDBRectangulo() {
        try {
            if (sistemaEscalera.getPartida().tieneDisponibleIngresarPieza(TipoPieza.Rectangulo)) {
                rdbRectangulo.setEnabled(true);
                rdbRectangulo.setBounds(80, 120, 20, 20);
                rdbRectangulo.setText("Rectangulo");
                rdbRectangulo.addActionListener(new java.awt.event.ActionListener() {
                    public void actionPerformed(java.awt.event.ActionEvent evt) {
                        try {
                            //rotarPieza();
                            dibujarRectangulo(1, 2);
                            btnRotar.setEnabled(true);
                            piezaSeleccionada = new Pieza(TipoPieza.Rectangulo, rotacionR);

                        } catch (Exception ex) {
                            JOptionPane.showMessageDialog(null, ex.getMessage(), "Error en la Partida", JOptionPane.ERROR_MESSAGE);
                        }
                    }
                });
            } else {
                rdbRectangulo.setEnabled(false);
                rdbRectangulo.setBounds(80, 120, 20, 20);
                rdbRectangulo.setText("Rectangulo");
                rdbRectangulo.addActionListener(new java.awt.event.ActionListener() {
                    public void actionPerformed(java.awt.event.ActionEvent evt) {
                        try {
                            //rotarPieza();
                            dibujarRectangulo(1, 2);
                            btnRotar.setEnabled(true);
                            piezaSeleccionada = new Pieza(TipoPieza.Rectangulo, rotacionR);

                        } catch (Exception ex) {
                            JOptionPane.showMessageDialog(null, ex.getMessage(), "Error en la Partida", JOptionPane.ERROR_MESSAGE);
                        }
                    }
                });
            }
        } catch (Exception ex) {
            JOptionPane.showMessageDialog(null, ex.getMessage(), "Error en la Partida", JOptionPane.ERROR_MESSAGE);
        }
        return rdbRectangulo;
    }

    /**
     *
     * @return
     */
    private JRadioButton getRDBLadrilloL() {
        try {
            if (sistemaEscalera.getPartida().tieneDisponibleIngresarPieza(TipoPieza.Rectangulo)) {
                rdbLadrilloL.setEnabled(true);
                rdbLadrilloL.setBounds(80, 120, 20, 20);
                rdbLadrilloL.setText("Ladrillo L");
                rdbLadrilloL.addActionListener(new java.awt.event.ActionListener() {
                    public void actionPerformed(java.awt.event.ActionEvent evt) {
                        try {
                            //rotarPieza();
                            dibujarLadrilloL(2, 2);
                            btnRotar.setEnabled(true);
                            piezaSeleccionada = new Pieza(TipoPieza.LadrilloL, rotacionL);

                        } catch (Exception ex) {
                            JOptionPane.showMessageDialog(null, ex.getMessage(), "Error en la Partida", JOptionPane.ERROR_MESSAGE);
                        }
                    }
                });
            } else {
                rdbLadrilloL.setEnabled(false);
                rdbLadrilloL.setBounds(80, 120, 20, 20);
                rdbLadrilloL.setText("Ladrillo L");
                rdbLadrilloL.addActionListener(new java.awt.event.ActionListener() {
                    public void actionPerformed(java.awt.event.ActionEvent evt) {
                        try {
                            //rotarPieza();
                            dibujarLadrilloL(2, 2);
                            btnRotar.setEnabled(true);
                            piezaSeleccionada = new Pieza(TipoPieza.LadrilloL, rotacionL);

                        } catch (Exception ex) {
                            JOptionPane.showMessageDialog(null, ex.getMessage(), "Error en la Partida", JOptionPane.ERROR_MESSAGE);
                        }
                    }
                });
            }
        } catch (Exception ex) {
            JOptionPane.showMessageDialog(null, ex.getMessage(), "Error en la Partida", JOptionPane.ERROR_MESSAGE);
        }
        return rdbLadrilloL;
    }

    /**
     * Creación del grupo de botones recibe nuestro radiobutton creados
     * anteriormente
     *
     * @param radio1
     */
    private void getButtonGroupPiezas(JRadioButton[] radio1) {
        //creamos el objeto
        ButtonGroup bgroup = new ButtonGroup();
        if (radio1 != null) {
            for (int btn = 0; btn < radio1.length; btn++) {
                //añadimos al grupo el radioButton
                bgroup.add(radio1[btn]);
            }
        }
    }

    /**
     *
     * @param pFila
     * @param pColumna
     */
    private void btnTableroActionPerformed(int pFila, int pColumna) {
        // Método a completar!. 
        // En fila y columna se reciben las coordenas donde presionó el usuario, relativas al comienzo de la grilla 
        // fila 1 y columna 1 corresponden a la posición de arriba a la izquierda. 
        // Debe indicarse cómo responder al click de ese botón. 
        //throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
        boolean habilitado = false;
        try {
            if (!finalizo) {
                //Si esta haciendo clic sobre una celda que no esta basia pero es una ficha
                if (sistemaEscalera.getPartida().getTablero()[pFila][pColumna] != null
                        && (!sistemaEscalera.getPartida().getTablero()[pFila][pColumna].isEsLabrillo()
                        || sistemaEscalera.getPartida().getTablero()[pFila][pColumna].getFicha() != null)) {
                    //Si no habia seleccionado una ficha para mover o retirar
                    if (fichaEnTablero == null) {

                        Coordenada[] coorde = {new Coordenada(pFila, pColumna)};
                        Jugada ultima = sistemaEscalera.getPartida().ultimaJugadaDeSuFicha(sistemaEscalera.getPartida().turnoJugador());
                        if (ultima.getPieza().getUbicacion()[0].equals(coorde[0])) {
                            fichaEnTablero = new Pieza(TipoPieza.Ficha, coorde);

                            JRadioButton[] radios = {getRDBRetirar(), getRDBMover()};
                            getButtonGroupAccionesFicha(radios);
                            rdbMover.setSelected(true);
                            panelAccionesFicha.setVisible(true);
                            piezaSeleccionada = null;
                            for (Component componente : panelTipoPieza.getComponents()) {
                                if (!componente.equals(chkNiveles)) {
                                    componente.setEnabled(false);
                                }
                            }
                        }
                    } else {
                        Coordenada[] coorde = {new Coordenada(pFila, pColumna)};
                        Jugada ultima = sistemaEscalera.getPartida().ultimaJugadaDeFichaContraria(sistemaEscalera.getPartida().turnoJugador());
                        //Si no esta haciendo clic sobre la ficha del contrario
                        if (ultima.getPieza().getUbicacion()[0].equals(coorde[0])) {
                            marcarMovimientosFicha(pFila, pColumna, coorde);
                        }
                    }
                } else {
                    if (fichaEnTablero != null) {
                        Coordenada[] coorde = {new Coordenada(pFila, pColumna)};
                        marcarMovimientosFicha(pFila, pColumna, coorde);
                    } else {
                        ingresarPieza(pFila, pColumna);
                        estadoDeJuego();
                    }
                }
            } else {
                listarResultadoDeLaPartida();
            }
        } catch (Exception ex) {
            JOptionPane.showMessageDialog(null, ex.getMessage(), "Error de jugada", JOptionPane.ERROR_MESSAGE);
        }
    }

    /**
     *
     * @param pFila
     * @param pColumna
     * @throws Exception
     */
    private void ingresarPieza(int pFila, int pColumna) throws Exception {
        switch (piezaSeleccionada.getTipo()) {
            case Ficha:
                Coordenada[] coordenadas = {new Coordenada(pFila, pColumna)};
                ingresarFicha(coordenadas);
                break;
            default:
                piezaSeleccionada.ordenarUbicaciones();
                Pieza over = piezaSeleccionada.clone();
                Coordenada inicial = null;
                boolean fuera = false;
                //Recorro el array de posiciones
                for (int i = 0; i < over.getUbicacion().length && !fuera; i++) {
                    Coordenada actual = over.getUbicacion()[i];
                    if (i == 0) {
                        inicial = new Coordenada(actual.getPosFila(), actual.getPosColumna());
                        actual.setPosFila(pFila);
                        actual.setPosColumna(pColumna);
                    } else {
                        //inicial = piezaSeleccionada.getUbicacion()[i - 1];
                        //Si la fila anterior es MENOR a la actual
                        if (inicial.getPosFila() < actual.getPosFila()) {
                            actual.setPosFila(pFila + 1);
                            //Si la columna anterior es MENOR a la actual
                            if (inicial.getPosColumna() < actual.getPosColumna()) {
                                actual.setPosColumna(pColumna + 1);
                            } else {
                                if (inicial.getPosColumna() > actual.getPosColumna()) {
                                    actual.setPosColumna(pColumna - 1);
                                } else {
                                    actual.setPosColumna(pColumna);
                                }
                            }
                        } else {
                            //Si la fila anterior es MAYOR a la actual
                            if (inicial.getPosFila() > actual.getPosFila()) {
                                actual.setPosFila(pFila - 1);
                                //Si la columna anterior es MAYOR a la actual
                                if (inicial.getPosColumna() > actual.getPosColumna()) {
                                    actual.setPosColumna(pColumna - 1);
                                } else {
                                    if (inicial.getPosColumna() < actual.getPosColumna()) {
                                        actual.setPosColumna(pColumna + 1);
                                    } else {
                                        actual.setPosColumna(pColumna);
                                    }
                                }

                            } else {
                                actual.setPosFila(pFila);
                                //Si la columna anterior es MAYOR a la actual
                                if (inicial.getPosColumna() > actual.getPosColumna()) {
                                    actual.setPosColumna(pColumna - 1);
                                } else {
                                    if (inicial.getPosColumna() < actual.getPosColumna()) {
                                        actual.setPosColumna(pColumna + 1);
                                    } else {
                                        actual.setPosColumna(pColumna);
                                    }
                                }
                            }
                        }

                    }
                    fuera = ((actual.getPosFila() < 0 || actual.getPosFila() >= dimension)
                            || (actual.getPosColumna() < 0 || actual.getPosColumna() >= dimension));
                }

                if (fuera) {
                    throw new Exception("No es posible ingresar el ladrillo, una parte queda fuera del tablero.");

                } else {
                    ponerLadrillo(over.getUbicacion());
                }
                break;
        }
    }

    /**
     *
     * @param pFila
     * @param pColumna
     * @param coorde
     * @throws Exception
     */
    private void marcarMovimientosFicha(int pFila, int pColumna, Coordenada[] coorde) throws Exception {

        if (listaMovimientos != null) {
            listaMovimientos.add(coorde[0]);
        } else {
            listaMovimientos = new ArrayList<Coordenada>();
            listaMovimientos.add(coorde[0]);
        }
        //piezaSeleccionada = new Pieza(Ficha, coorde);
        botonesTablero[pFila][pColumna].setBackground(escalaRojo);

    }

    /**
     *
     * @param pIndicar
     */
    private void indicarNiveles(boolean pIndicar) {
        // crear botones y agregarlos al panel 
        try {
            panelJuego.removeAll();
            panelJuego.setLayout(new GridLayout(dimension, dimension));
            //botonesTablero = new JButton[dimension][dimension];
            if (sistemaEscalera.getPartida() != null) {
                sistemaEscalera.getPartida().getTablero();
                for (int posFila = 0; posFila < sistemaEscalera.getPartida().getTablero().length; posFila++) {
                    Celda[] celdas = sistemaEscalera.getPartida().getTablero()[posFila];
                    for (int posColumna = 0; posColumna < celdas.length; posColumna++) {
                        Celda celda = celdas[posColumna];
                        JButton jButton = botonesTablero[posFila][posColumna];
                        if (celda != null) {
                            if (pIndicar) {
                                jButton.setText(celda.getNivel() + "");
                            } else {
                                jButton.setText(null);
                            }
                        } else {
                            if (pIndicar) {
                                jButton.setText("0");
                            } else {
                                jButton.setText(null);
                            }
                        }
                        jButton.setEnabled(!finalizo);
                        panelJuego.add(jButton);
                    }
                }
            }
            panelJuego.setBounds(panelJuego.getX(), panelJuego.getY(), tamanioBotones * dimension, tamanioBotones * dimension);
            panelJuego.updateUI();
        } catch (Exception ex) {
            //JOptionPane.ERROR_MESSAGE
            System.out.println(ex.getMessage());
        }
    }

    /**
     *
     */
    private void dibujarTablero() {
        // crear botones y agregarlos al panel 
        try {
            panelJuego.removeAll();
            panelJuego.setLayout(new GridLayout(dimension, dimension));
            botonesTablero = new JButton[dimension][dimension];
            if (sistemaEscalera.getPartida() != null) {
                sistemaEscalera.getPartida().getTablero();
                for (int posFila = 0; posFila < sistemaEscalera.getPartida().getTablero().length; posFila++) {
                    Celda[] celdas = sistemaEscalera.getPartida().getTablero()[posFila];
                    for (int posColumna = 0; posColumna < celdas.length; posColumna++) {
                        Celda celda = celdas[posColumna];
                        JButton jButton = new JButton();
                        jButton.setSize(new Dimension(tamanioBotones, tamanioBotones));
                        jButton.addActionListener(new Partidas.ListenerBotonTablero(posFila, posColumna));
                        jButton.addMouseListener(new Partidas.ListenerMouseTablero(posFila, posColumna));
                        jButton.setMargin(new Insets(-5, -5, -5, -5));
                        if (celda != null) {
                            if (celda.isEsLabrillo() && celda.getFicha() == null) {

                                //if (celda.getFicha().equals("")){
                                jButton.setIcon(iconoConector);
                                if (celda.isLinderoTOP()) {
                                    if (celda.isLinderoLEFT()) {
                                        jButton.setIcon(iconoConectorTopLeft);
                                    } else if (celda.isLinderoRIGHT()) {
                                        jButton.setIcon(iconoConectorTopRight);
                                    } else {
                                        jButton.setIcon(iconoConectorTop);
                                    }
                                } else if (celda.isLinderoBOTTOM()) {
                                    if (celda.isLinderoLEFT()) {
                                        jButton.setIcon(iconoConectorBottomLeft);
                                    } else if (celda.isLinderoRIGHT()) {
                                        jButton.setIcon(iconoConectorBottomRight);
                                    } else {
                                        jButton.setIcon(iconoConectorBottom);
                                    }
                                } else if (celda.isLinderoLEFT()) {
                                    jButton.setIcon(iconoConectorLeft);
                                } else if (celda.isLinderoRIGHT()) {
                                    jButton.setIcon(iconoConectorRight);
                                } else {
                                }
                            } else {
                                if (celda.getFicha().equals("B")) {
                                    jButton.setIcon(iconoFichaBlanca);
                                } else {
                                    jButton.setIcon(iconoFichaNegra);
                                }
                            }
                            int decrementoColor = (3 + (12 * celda.getNivel()));
                            jButton.setBackground(new Color((escalaGris.getRed() - decrementoColor) % 255, (escalaGris.getGreen() - decrementoColor) % 255, (escalaGris.getBlue() - decrementoColor) % 255));
                            if (chkNiveles.isSelected()) {
                                jButton.setText(celda.getNivel() + "");
                            } else {
                                jButton.setText(null);
                            }
                        } else {
                            if (chkNiveles.isSelected()) {
                                jButton.setText("0");
                                jButton.setBackground(null);
                            } else {
                                jButton.setText(null);
                                jButton.setBackground(null);
                            }
                        }
                        jButton.setEnabled(!finalizo);
                        panelJuego.add(jButton);
                        botonesTablero[posFila][posColumna] = jButton;
                    }
                }
            } else {
                for (int posFila = 0; posFila < dimension; posFila++) {
                    for (int posColumna = 0; posColumna < dimension; posColumna++) {
                        JButton jButton = new JButton();
                        jButton.setSize(new Dimension(tamanioBotones, tamanioBotones));
                        jButton.addActionListener(new Partidas.ListenerBotonTablero(posFila, posColumna));
                        jButton.addMouseListener(new Partidas.ListenerMouseTablero(posFila, posColumna));
                        if (chkNiveles.isSelected()) {
                            jButton.setText("0");
                        } else {
                            jButton.setText(null);
                        }
                        jButton.setEnabled(!finalizo);
                        panelJuego.add(jButton);
                        botonesTablero[posFila][posColumna] = jButton;
                    }
                }
            }
            panelJuego.setBounds(panelJuego.getX(), panelJuego.getY(), tamanioBotones * dimension, tamanioBotones * dimension);
            panelJuego.updateUI();
        } catch (Exception ex) {
            //JOptionPane.ERROR_MESSAGE
            System.out.println(ex.getMessage());
        }
    }

    /**
     *
     * @param pArchivo
     * @throws Exception
     */
    private void listarJugadasDeLaPartida(String pArchivo) throws Exception {
        try {
            ArchivoGrabacion grabar = new ArchivoGrabacion(pArchivo);
            grabar.grabarLinea(String.format("La partida comienza entre '%s' y '%s', la cantidad de jugadas por jugador es %s.",
                    sistemaEscalera.getPartida().getBlanco().getAlias(),
                    sistemaEscalera.getPartida().getNegro().getAlias(),
                    (sistemaEscalera.getPartida().getCantidadMaximaJugadas() == Integer.MAX_VALUE) ? "infinitas" : sistemaEscalera.getPartida().getCantidadMaximaJugadas()));
            grabar.grabarLinea(String.format("Cada jugador dispone de %s ladrillos cuadrados, %s ladrillo rectangular y %s ladrillo/s L.",
                    sistemaEscalera.getPartida().getCantidadC(),
                    sistemaEscalera.getPartida().getCantidadR(),
                    (sistemaEscalera.getPartida().getCantidadL() == Integer.MAX_VALUE) ? "infinitos" : sistemaEscalera.getPartida().getCantidadL()));
            Collections.sort(sistemaEscalera.getPartida().getListaJugadas());
            if (sistemaEscalera.getPartida().getListaJugadas() != null) {

                for (int i = sistemaEscalera.getPartida().getListaJugadas().size() - 1; i >= 0; i--) {
                    Jugada jugada = sistemaEscalera.getPartida().getListaJugadas().get(i);
                    if (jugada.getJugador().equals(sistemaEscalera.getPartida().getBlanco())) {
                        grabar.grabarLinea(String.format("Turno del jugador Blanco '%s'.", sistemaEscalera.getPartida().getBlanco().getAlias()));
                        grabar.grabarLinea(jugada.jugadaToString());
                    } else {
                        grabar.grabarLinea(String.format("Turno del jugador Negro '%s'.", sistemaEscalera.getPartida().getNegro().getAlias()));
                        grabar.grabarLinea(jugada.jugadaToString());
                    }
                }
            }
            if (sistemaEscalera.getPartida().getAbandona() != null) {
                if (sistemaEscalera.getPartida().getAbandona().equals(sistemaEscalera.getPartida().getBlanco())) {
                    grabar.grabarLinea(String.format("Turno del jugador Blanco '%s'.", sistemaEscalera.getPartida().getBlanco().getAlias()));
                    grabar.grabarLinea("El  Jugador Blanco " + sistemaEscalera.getPartida().getAbandona().getAlias() + " a abandonado la partida.");
                    grabar.grabarLinea("El  Ganador es el Negro '" + sistemaEscalera.getPartida().getNegro().getAlias() + "'.");

                } else {
                    grabar.grabarLinea(String.format("Turno del jugador Negro '%s'.", sistemaEscalera.getPartida().getNegro().getAlias()));
                    grabar.grabarLinea("El  Jugador Negro '" + sistemaEscalera.getPartida().getAbandona().getAlias() + "' a abandonado la partida.");
                    grabar.grabarLinea("El  Ganador es el Blanco '" + sistemaEscalera.getPartida().getBlanco().getAlias() + "'.");
                }
            } else {
                if (finalizo) {
                    grabar.grabarLinea(sistemaEscalera.getPartida().resultadoDeLaPartida());
                }
            }
            grabar.cerrar();
        } catch (Exception ex) {
            throw ex;
        }
    }

    /**
     *
     * @param pCoordenadas
     */
    private void ingresarFicha(Coordenada[] pCoordenadas) {
        try {
            sistemaEscalera.agregarJugada(sistemaEscalera.crearJugadaI(pCoordenadas));
        } catch (Exception ex) {
            JOptionPane.showMessageDialog(null, ex.getMessage(), "Error al ingresar la ficha", JOptionPane.ERROR_MESSAGE);
        }
    }

    /**
     *
     * @param pCoordenadas
     */
    private void moverFicha(Coordenada[] pCoordenadas) {
        try {
            sistemaEscalera.agregarJugada(sistemaEscalera.crearJugadaM(pCoordenadas));
        } catch (Exception ex) {
            JOptionPane.showMessageDialog(null, ex.getMessage(), "Error al mover la ficha", JOptionPane.ERROR_MESSAGE);
        }
    }

    /**
     *
     * @param pCoordenadas
     */
    private void ponerLadrillo(Coordenada[] pCoordenadas) {
        try {
            sistemaEscalera.agregarJugada(sistemaEscalera.crearJugadaP(null, pCoordenadas));
        } catch (Exception ex) {
            JOptionPane.showMessageDialog(null, ex.getMessage(), "Error al poner el ladrillo", JOptionPane.ERROR_MESSAGE);
        }
    }

    /**
     *
     */
    private void retirarFicha() {
        try {
            sistemaEscalera.agregarJugada(sistemaEscalera.crearJugadaR(TipoPieza.Ficha));
        } catch (Exception ex) {
            JOptionPane.showMessageDialog(null, ex.getMessage(), "Error al retirar la ficha", JOptionPane.ERROR_MESSAGE);
        }
    }

    /**
     * Abandona la partida el jugador pasado por parametro el otro jugador de la
     * partida es el ganador
     *
     * @return
     */
    private boolean abandonar() {
        boolean abandono = false;
        try {
            //cuando se valida todo, se crea el objeto jugador
            System.out.print("Está por abandonar la partida, ¿desea hacerlo? ");
            Object retorno = JOptionPane.showConfirmDialog(null, "Está por abandonar la partida, ¿desea hacerlo?", "Abandonar la partida", JOptionPane.YES_NO_OPTION);
            if (retorno.toString().equals("0")) {

                StringBuilder buil = new StringBuilder("El  Jugador: " + sistemaEscalera.getPartida().turnoJugador().getAlias() + " a abandonado la partida.");
                sistemaEscalera.abandonarPartida();
                buil.append(saltoLinea);
                buil.append("El  Ganador es: " + sistemaEscalera.getPartida().getGanador().getAlias());
                JOptionPane.showMessageDialog(null, buil.toString(), "Fin de la partida", JOptionPane.INFORMATION_MESSAGE);
                lstJugadas.add(buil.toString());
                abandono = true;
            }
        } catch (Exception ex) {
            JOptionPane.showMessageDialog(null, ex.getMessage(), "Error al abandonar la partida.", JOptionPane.ERROR_MESSAGE);
        }
        return abandono;
    }

    /**
     *
     */
    private void dibujarColumnas() {
        // crear botones y agregarlos al panel 
        panelColumnas.setLayout(new GridLayout(1, dimension));
        for (int posColumna = 1; posColumna <= dimension; posColumna++) {
            JLabel lbl = new JLabel("" + posColumna, SwingConstants.CENTER);
            lbl.setSize(new Dimension(tamanioBotones, 20));
            //lbl.setMargin(new Insets(-5, -5, -5, -5));;
            //lbl.setBackground(Color.);
            panelColumnas.add(lbl, BorderLayout.CENTER);
        }

        panelColumnas.setBounds(panelColumnas.getX(), panelColumnas.getY(), tamanioBotones * dimension, 20);
        panelColumnas.updateUI();
    }

    /**
     *
     */
    private void dibujarFilas() {
        // crear botones y agregarlos al panel 
        panelFilas.setLayout(new GridLayout(dimension, 1));
        for (int posFila = 0; posFila < dimension; posFila++) {
            JLabel lbl = new JLabel(escribirLetraFila(posFila), SwingConstants.CENTER);
            lbl.setSize(new Dimension(20, tamanioBotones));
            //lbl.setBackground(Color.);
            panelFilas.add(lbl, BorderLayout.CENTER);
        }
        panelFilas.setBounds(panelFilas.getX(), panelFilas.getY(), 20, tamanioBotones * dimension);
        panelFilas.updateUI();
    }

    /**
     *
     * @param pPosFila
     * @return
     */
    private String escribirLetraFila(int pPosFila) {
        String retorno = "";
        switch (pPosFila) {
            case 0:
                retorno = " A ";
                break;
            case 1:
                retorno = " B ";
                break;
            case 2:
                retorno = " C ";
                break;
            case 3:
                retorno = " D ";
                break;
            case 4:
                retorno = " E ";
                break;
            case 5:
                retorno = " F ";
                break;
            case 6:
                retorno = " G ";
                break;
            case 7:
                retorno = " H ";
                break;
            default:
                break;
        }
        return retorno;
    }

    /**
     *
     * @throws Exception
     */
    private void dibujarFicha() throws Exception {
        try {
            panelLadrillo.setLayout(new GridLayout(1, 1));
            panelLadrillo.removeAll();
            JButton jButton = new JButton();
            jButton.setSize(new Dimension(tamanioBotones, tamanioBotones));
            jButton.addActionListener(new Partidas.ListenerBotonFicha(0, 0));
            //jButton.addMouseListener(new Partidas.ListenerBotonMouseCuadrado(0, 0));
            //botonesCuadrado = jButton;
            jButton.setBackground(escalaGris);
            //jButton.setIcon(conector);
            if (sistemaEscalera.getPartida().turnoJugador().equals(sistemaEscalera.getPartida().getBlanco())) {
                jButton.setIcon(iconoFichaBlanca);
            } else {
                jButton.setIcon(iconoFichaNegra);
            }
            jButton.setEnabled(!finalizo);
            panelLadrillo.add(jButton);
            panelLadrillo.setBounds(panelLadrillo.getX(), panelLadrillo.getY(), tamanioBotones, tamanioBotones);
            panelLadrillo.updateUI();
        } catch (Exception ex) {
            throw ex;
        }
    }

    /**
     *
     * @throws Exception
     */
    private void dibujarCuadrado() throws Exception {
        try {
            panelLadrillo.setLayout(new GridLayout(1, 1));
            panelLadrillo.removeAll();
            JButton jButton = new JButton();
            jButton.setSize(new Dimension(tamanioBotones, tamanioBotones));
            jButton.addActionListener(new Partidas.ListenerBotonCuadrado(0, 0));
            //jButton.addMouseListener(new Partidas.ListenerBotonMouseCuadrado(0, 0));
            botonesCuadrado = jButton;
            jButton.setBackground(escalaGris);
            jButton.setIcon(iconoConector);

            jButton.setEnabled(!finalizo);
            panelLadrillo.add(jButton);
            panelLadrillo.setBounds(panelLadrillo.getX(), panelLadrillo.getY(), tamanioBotones, tamanioBotones);
            panelLadrillo.updateUI();
        } catch (Exception ex) {
            throw ex;
        }
    }

    /**
     *
     * @param pX
     * @param pY
     * @throws Exception
     */
    private void dibujarRectangulo(int pX, int pY) throws Exception {
        try {
            panelLadrillo.setLayout(new GridLayout(pX, pY));
            panelLadrillo.removeAll();
            botonesRectangulo = new JButton[pX][pY];

            for (int posFila = 0; posFila < pX; posFila++) {
                for (int posColumna = 0; posColumna < pY; posColumna++) {
                    Pieza pieza = new Pieza(TipoPieza.Rectangulo, rotacionR);
                    if (pieza.contienePosicion(new Coordenada(posFila, posColumna))) {
                        JButton jButton = new JButton();
                        jButton.setSize(new Dimension(tamanioBotones, tamanioBotones));
                        jButton.addActionListener(new Partidas.ListenerBotonRectangulo(posFila, posColumna));
//                        jButton.addMouseListener(new Partidas.ListenerBotonMouseRectangulo(posFila, posColumna));
                        panelLadrillo.add(jButton);
                        jButton.setBackground(escalaGris);
                        if (pieza.contienePosicion(new Coordenada(posFila - 1, posColumna))
                                && !pieza.contienePosicion(new Coordenada(posFila, posColumna + 1))
                                && !pieza.contienePosicion(new Coordenada(posFila, posColumna - 1))) {
                            jButton.setIcon(iconoConectorTop);
                        } else if (pieza.contienePosicion(new Coordenada(posFila + 1, posColumna))
                                && !pieza.contienePosicion(new Coordenada(posFila, posColumna + 1))
                                && !pieza.contienePosicion(new Coordenada(posFila, posColumna - 1))) {
                            jButton.setIcon(iconoConectorBottom);
                        } else if (pieza.contienePosicion(new Coordenada(posFila, posColumna + 1))
                                && !pieza.contienePosicion(new Coordenada(posFila + 1, posColumna))
                                && !pieza.contienePosicion(new Coordenada(posFila - 1, posColumna))) {
                            jButton.setIcon(iconoConectorRight);
                        } else if (pieza.contienePosicion(new Coordenada(posFila, posColumna - 1))
                                && !pieza.contienePosicion(new Coordenada(posFila + 1, posColumna))
                                && !pieza.contienePosicion(new Coordenada(posFila - 1, posColumna))) {
                            jButton.setIcon(iconoConectorLeft);
                        }
                        jButton.setEnabled(!finalizo);
                        botonesRectangulo[posFila][posColumna] = jButton;
                    } else {
                        //botones[posFila][posColumna].setBackground(new Color(107, 106, 104));
                        JLabel lbl = new JLabel(" ");

                        lbl.setSize(new Dimension(tamanioBotones, tamanioBotones));
                        panelLadrillo.add(lbl);
                    }
                }
            }
            panelLadrillo.setBounds(panelLadrillo.getX(), panelLadrillo.getY(), tamanioBotones * pY, tamanioBotones * pX);
            panelLadrillo.updateUI();
        } catch (Exception ex) {
            throw ex;
        }
    }

    /**
     *
     * @param pX
     * @param pY
     * @throws Exception
     */
    private void dibujarLadrilloL(int pX, int pY) throws Exception {
        try {
            panelLadrillo.setLayout(new GridLayout(pX, pY));
            panelLadrillo.removeAll();
            botonesLadrilloL = new JButton[pX][pY];
            for (int posFila = 0; posFila < pX; posFila++) {
                for (int posColumna = 0; posColumna < pY; posColumna++) {
                    Pieza pieza = new Pieza(TipoPieza.LadrilloL, rotacionL);
                    //if (posFila == rotacionL.getPosFila() && posColumna == rotacionL.getPosColumna()) {
                    if (pieza.contienePosicion(new Coordenada(posFila, posColumna))) {
                        JButton jButton = new JButton();
                        jButton.setSize(new Dimension(tamanioBotones, tamanioBotones));
                        jButton.addActionListener(new Partidas.ListenerBotonLadrilloL(posFila, posColumna));
//                        jButton.addMouseListener(new Partidas.ListenerBotonMouseLadrilloL(posFila, posColumna));
                        jButton.setBackground(escalaGris);
                        if (pieza.contienePosicion(new Coordenada(posFila - 1, posColumna))
                                && !pieza.contienePosicion(new Coordenada(posFila, posColumna + 1))
                                && !pieza.contienePosicion(new Coordenada(posFila, posColumna - 1))) {
                            jButton.setIcon(iconoConectorTop);
                        } else if (pieza.contienePosicion(new Coordenada(posFila + 1, posColumna))
                                && !pieza.contienePosicion(new Coordenada(posFila, posColumna + 1))
                                && !pieza.contienePosicion(new Coordenada(posFila, posColumna - 1))) {
                            jButton.setIcon(iconoConectorBottom);
                        } else if (pieza.contienePosicion(new Coordenada(posFila - 1, posColumna))
                                && pieza.contienePosicion(new Coordenada(posFila, posColumna + 1))) {
                            jButton.setIcon(iconoConectorTopRight);
                        } else if (pieza.contienePosicion(new Coordenada(posFila - 1, posColumna))
                                && pieza.contienePosicion(new Coordenada(posFila, posColumna - 1))) {
                            jButton.setIcon(iconoConectorTopLeft);
                        } else if (pieza.contienePosicion(new Coordenada(posFila + 1, posColumna))
                                && pieza.contienePosicion(new Coordenada(posFila, posColumna + 1))) {
                            jButton.setIcon(iconoConectorBottomRight);
                        } else if (pieza.contienePosicion(new Coordenada(posFila + 1, posColumna))
                                && pieza.contienePosicion(new Coordenada(posFila, posColumna - 1))) {
                            jButton.setIcon(iconoConectorBottomLeft);
                        } else if (!pieza.contienePosicion(new Coordenada(posFila + 1, posColumna))
                                && pieza.contienePosicion(new Coordenada(posFila, posColumna + 1))) {
                            jButton.setIcon(iconoConectorRight);
                        } else if (!pieza.contienePosicion(new Coordenada(posFila + 1, posColumna))
                                && pieza.contienePosicion(new Coordenada(posFila, posColumna - 1))) {
                            jButton.setIcon(iconoConectorLeft);
                        }

                        jButton.setEnabled(!finalizo);
                        panelLadrillo.add(jButton);
                        botonesLadrilloL[posFila][posColumna] = jButton;
                    } else {
                        //botones[posFila][posColumna].setBackground(new Color(107, 106, 104));
                        Label lbl = new Label();
                        //lbl.setBackground(new Color(107, 106, 104));
                        panelLadrillo.add(lbl);
                    }
                }
            }
            panelLadrillo.setBounds(panelLadrillo.getX(), panelLadrillo.getY(), tamanioBotones * pY, tamanioBotones * pX);
            panelLadrillo.updateUI();
        } catch (Exception ex) {
            throw ex;
        }
    }

    /**
     *
     */
    private void btnRotarActionPerformed() {
        try {

            if (!finalizo) {
                if (rdbCuadrado.isSelected()) {
                    dibujarCuadrado();
                    Coordenada[] coordenada = {new Coordenada(0, 0)};
                    piezaSeleccionada = new Pieza(TipoPieza.Cuadrado, coordenada);
                }
                if (rdbRectangulo.isSelected()) {
                    if (rotacionR[1].getPosFila() != 1) {
                        rotacionR[0] = new Coordenada(0, 0);
                        rotacionR[1] = new Coordenada(1, 0);
                        dibujarRectangulo(2, 1);
                    } else {
                        rotacionR[0] = new Coordenada(0, 0);
                        rotacionR[1] = new Coordenada(0, 1);
                        dibujarRectangulo(1, 2);
                    }
                    piezaSeleccionada = new Pieza(TipoPieza.Rectangulo, rotacionR);
                }
                if (rdbLadrilloL.isSelected()) {
                    rotarCoordenada(rotacionL[0]);
                    rotarCoordenada(rotacionL[1]);
                    rotarCoordenada(rotacionL[2]);
                    dibujarLadrilloL(2, 2);
                    piezaSeleccionada = new Pieza(TipoPieza.LadrilloL, rotacionL);
                }
            }
        } catch (Exception ex) {
            JOptionPane.showMessageDialog(null, ex.getMessage(), "Error en la Partida", JOptionPane.ERROR_MESSAGE);
        }
    }

    /**
     *
     * @param pCoordenada
     */
    private void rotarCoordenada(Coordenada pCoordenada) {
        // TODO add your handling code here:
        if (pCoordenada.getPosFila() + pCoordenada.getPosColumna() == 0) {
            pCoordenada.setPosFila(0);
            pCoordenada.setPosColumna(1);
        } else if (pCoordenada.getPosFila() + pCoordenada.getPosColumna() == 2) {
            pCoordenada.setPosFila(1);
            pCoordenada.setPosColumna(0);
        } else {
            if (pCoordenada.getPosFila() == 0) {
                pCoordenada.setPosFila(1);
                pCoordenada.setPosColumna(1);
            }
            if (pCoordenada.getPosColumna() == 0) {
                pCoordenada.setPosFila(0);
                pCoordenada.setPosColumna(0);
            }
        }
    }

    /**
     *
     * @throws Exception
     */
    private void estadoDeJuego() throws Exception {
        try {
            finalizo = !finalizo ? sistemaEscalera.finalDeLaPartida(false) : false;
            if (sistemaEscalera.getPartida().getListaJugadas() != null) {
                int ultimaJugada = sistemaEscalera.getPartida().getListaJugadas().size() - 1;

                if (sistemaEscalera.getPartida().getListaJugadas().size() > 1) {
                    if (tamañoLista != sistemaEscalera.getPartida().getListaJugadas().size()) {
                        lstJugadas.add(sistemaEscalera.getPartida().getListaJugadas().get(0).jugadaToString());
                    }
                } else {
                    lstJugadas.add(sistemaEscalera.getPartida().getListaJugadas().get(0).jugadaToString());
                }

            }

            if (finalizo) {
                listarResultadoDeLaPartida();
            } else {
                listarJugada();
            }
            tamañoLista = sistemaEscalera.getPartida().getListaJugadas().size();
            dibujarTablero();
            cargarPiezasDisponibles();
        } catch (Exception ex) {
            throw ex;
        }
    }

    private void listarResultadoDeLaPartida() {
        String resultado = sistemaEscalera.getPartida().resultadoDeLaPartida();
        JOptionPane.showMessageDialog(null, resultado, "Finalizo el tiempo de juego", JOptionPane.ERROR_MESSAGE);
        lstJugadas.add(resultado);
        lstJugadas.select(lstJugadas.getItemCount() - 1);
    }

    private void listarJugada() throws Exception {

        if (sistemaEscalera.getPartida().getListaJugadas().size() > 1) {
            if (tamañoLista != sistemaEscalera.getPartida().getListaJugadas().size()) {
                lstJugadas.add("");
                lstJugadas.add(sistemaEscalera.getPartida().turnoJugadorToString());
                lstJugadas.add(sistemaEscalera.getPartida().estadoPiezasJugador());
                lstJugadas.select(lstJugadas.getItemCount() - 1);
            }
        } else {
            lstJugadas.add("");
            lstJugadas.add(sistemaEscalera.getPartida().turnoJugadorToString());
            lstJugadas.add(sistemaEscalera.getPartida().estadoPiezasJugador());
            lstJugadas.select(lstJugadas.getItemCount() - 1);
        }
    }

    /**
     *
     * @throws Exception
     */
    private void cargarPiezasDisponibles() throws Exception {
        boolean habilitado = false;
        if (sistemaEscalera.getPartida().tieneDisponibleIngresarPieza(TipoPieza.Ficha)) {
            rdbFicha.setEnabled(!finalizo);
            habilitado = true;
            if (piezaSeleccionada == null) {
                piezaSeleccionada = new Pieza(Ficha);
                dibujarFicha();
            }
        } else {
            rdbFicha.setEnabled(false);
        }
        if (sistemaEscalera.getPartida().tieneDisponibleIngresarPieza(TipoPieza.Cuadrado)) {
            rdbCuadrado.setEnabled(!finalizo);
            habilitado = true;
            if (piezaSeleccionada == null) {
                piezaSeleccionada = new Pieza(TipoPieza.Cuadrado);
                dibujarCuadrado();
            }
        } else {
            rdbCuadrado.setEnabled(false);
        }
        if (sistemaEscalera.getPartida().tieneDisponibleIngresarPieza(TipoPieza.Rectangulo)) {
            rdbRectangulo.setEnabled(!finalizo);
            habilitado = true;
            if (piezaSeleccionada == null) {
                piezaSeleccionada = new Pieza(TipoPieza.Rectangulo);
                dibujarRectangulo(1, 2);
            }
        } else {
            rdbRectangulo.setEnabled(false);
        }
        if (sistemaEscalera.getPartida().tieneDisponibleIngresarPieza(TipoPieza.LadrilloL)) {
            rdbLadrilloL.setEnabled(!finalizo);
            habilitado = true;
            if (piezaSeleccionada == null) {
                piezaSeleccionada = new Pieza(TipoPieza.LadrilloL);
                dibujarLadrilloL(2, 2);
            }
        } else {
            rdbLadrilloL.setEnabled(false);
        }
        if (habilitado) {
            panelLadrillo.setVisible(!finalizo);
        } else {
            panelLadrillo.setVisible(false);
        }
    }

    private class ListenerMouseTablero implements MouseListener {

        private JButton[] botones = new JButton[4];
        private int x;
        private int y;

        public ListenerMouseTablero(int i, int j) {
            // en el constructor se almacena la fila y columna que se presionó 
            x = i;
            y = j;
        }

        @Override
        public void mouseClicked(MouseEvent e) {
            if (!finalizo) {
                //mouseCliqueeado(x, y);
            }
        }

        @Override
        public void mousePressed(MouseEvent e) {
            if (!finalizo) {
                //mouseApretado(x, y);
            }
        }

        @Override
        public void mouseReleased(MouseEvent e) {
            if (!finalizo) {
                //mouseSoltado(x, y);
            }
        }

        @Override
        public void mouseEntered(MouseEvent e) {
            try {
                if (!finalizo) {
//                    if (piezaSeleccionada != null) {
//                        mouseEntra(x, y);
//                        botonesTablero[x][y].setBackground(null);
//                        botonesTablero[x][y].setFocusPainted(true);
//                        botonesTablero[x][y].setBorderPainted(false);
//                        if (piezaSeleccionada.getTipo().equals(TipoPieza.Rectangulo) || piezaSeleccionada.getTipo().equals(TipoPieza.LadrilloL)) {
//                            Pieza over = piezaSeleccionada.clone();
//                            over.ordenarUbicaciones();
//                            Coordenada anterior = null;
//                            boolean rojo = false;
//                            for (int i = 0; i < over.getUbicacion().length; i++) {
//                                    Coordenada actual = over.getUbicacion()[i];
//                                    if (i == 0) {
//                                        actual.setPosFila(x);
//                                        actual.setPosColumna(y);
//                                    } else {
//                                        anterior = piezaSeleccionada.getUbicacion()[i - 1];
//                                        if (anterior.compareTo(actual) < 0) {
//                                            actual.setPosFila(x + actual.getPosFila());
//                                            actual.setPosColumna(y + actual.getPosColumna());
//                                        } else {
//                                            actual.setPosFila(x - actual.getPosFila());
//                                            actual.setPosColumna(y - actual.getPosColumna());
//
//                                        }
//                                    }
//                                    rojo = ((actual.getPosFila() < 0 || actual.getPosFila() >= dimension)
//                                            || (actual.getPosColumna() < 0 || actual.getPosColumna() >= dimension));
//                                }
//                            for (int i = 0; i < over.getUbicacion().length; i++) {
//                                Coordenada actual = over.getUbicacion()[i];
//                                if (rojo && !((actual.getPosFila() < 0 || actual.getPosFila() >= dimension)
//                                        || (actual.getPosColumna() < 0 || actual.getPosColumna() >= dimension))) {
//                                    botonesTablero[actual.getPosFila()][actual.getPosColumna()].setBackground(Color.RED);
//                                    botonesTablero[actual.getPosFila()][actual.getPosColumna()].setFocusPainted(true);
//                                    botonesTablero[actual.getPosFila()][actual.getPosColumna()].setBorderPainted(false);
//                                }
//                            }
//                        }
//                    }
                }
            } catch (Exception ex) {
                JOptionPane.showMessageDialog(null, ex.getMessage(), "Error.", JOptionPane.ERROR_MESSAGE);
            }
        }

        @Override
        public void mouseExited(MouseEvent e) {
            try {
                if (!finalizo) {
//                    if (piezaSeleccionada != null) {
//                        mouseSale(x, y);
//                        botonesTablero[x][y].setBackground(null);
//                        botonesTablero[x][y].setFocusPainted(false);
//                        botonesTablero[x][y].setBorderPainted(true);
//                        if (piezaSeleccionada.getTipo().equals(TipoPieza.Rectangulo) || piezaSeleccionada.getTipo().equals(TipoPieza.LadrilloL)) {
//                            Pieza over = piezaSeleccionada.clone();
//                            //over.ordenarUbicaciones();
//                            Coordenada anterior = null;
//                            boolean vale = true;
//                            for (int i = 0; i < over.getUbicacion().length; i++) {
//                                    Coordenada actual = over.getUbicacion()[i];
//                                    if (i == 0) {
//                                        actual.setPosFila(x);
//                                        actual.setPosColumna(y);
//                                    } else {
//                                        anterior = piezaSeleccionada.getUbicacion()[i - 1];
//                                        if (anterior.compareTo(actual) < 0) {
//                                            actual.setPosFila(x + actual.getPosFila());
//                                            actual.setPosColumna(y + actual.getPosColumna());
//                                        } else {
//                                            actual.setPosFila(x - actual.getPosFila());
//                                            actual.setPosColumna(y - actual.getPosColumna());
//
//                                        }
//                                    }
//                                if ((actual.getPosFila() >= 0 || actual.getPosFila() < dimension)
//                                        || (actual.getPosColumna() >= 0 || actual.getPosColumna() < dimension)) {
//                                    botonesTablero[x][y].setBackground(null);
//                                    botonesTablero[x][y].setFocusPainted(false);
//                                    botonesTablero[x][y].setBorderPainted(true);
//                                }
//                            }
//                        }
//                    }
                }
            } catch (Exception ex) {
                JOptionPane.showMessageDialog(null, ex.getMessage(), "Error.", JOptionPane.ERROR_MESSAGE);
            }
        }
    }

    private class ListenerBotonTablero implements ActionListener {

        private JButton[] botones = new JButton[4];
        private int x;
        private int y;

        public ListenerBotonTablero(int i, int j) {
            // en el constructor se almacena la fila y columna que se presionó 
            x = i;
            y = j;
        }

        public void actionPerformed(ActionEvent e) {
            // cuando se presiona un botón, se ejecutará este método 
            btnTableroActionPerformed(x, y);
        }
    }

    /**
     *
     */
    private class ListenerBotonFicha implements ActionListener {

        private int x;
        private int y;

        public ListenerBotonFicha(int i, int j) {
            // en el constructor se almacena la fila y columna que se presionó 
            x = i;
            y = j;
        }

        public void actionPerformed(ActionEvent e) {
//            // cuando se presiona un botón, se ejecutará este método 
//            if (!finalizo) {
//                piezaSeleccionada = new Pieza(TipoPieza.Ficha);
//            }
        }
    }

    /**
     *
     */
    private class ListenerBotonCuadrado implements ActionListener {

        private int x;
        private int y;

        public ListenerBotonCuadrado(int i, int j) {
            // en el constructor se almacena la fila y columna que se presionó 
            x = i;
            y = j;
        }

        public void actionPerformed(ActionEvent e) {
            // cuando se presiona un botón, se ejecutará este método 
//            if (!finalizo) {
//                Coordenada[] coordenada = {new Coordenada(0, 0)};
//                piezaSeleccionada = new Pieza(TipoPieza.Cuadrado, coordenada);
//            }
        }
    }

    /**
     *
     */
    private class ListenerBotonRectangulo implements ActionListener {

        private int x;
        private int y;

        public ListenerBotonRectangulo(int i, int j) {
            // en el constructor se almacena la fila y columna que se presionó 
            x = i;
            y = j;
        }

        public void actionPerformed(ActionEvent e) {
            // cuando se presiona un botón, se ejecutará este método 
//            if (!finalizo) {
//                piezaSeleccionada = new Pieza(TipoPieza.Rectangulo, rotacionR);
//                //clickBoton(x, y);
//            }
        }
    }

    /**
     *
     */
    private class ListenerBotonLadrilloL implements ActionListener {

        private int x;
        private int y;

        public ListenerBotonLadrilloL(int i, int j) {
            // en el constructor se almacena la fila y columna que se presionó 
            x = i;
            y = j;
        }

        public void actionPerformed(ActionEvent e) {
            // cuando se presiona un botón, se ejecutará este método 
//            if (!finalizo) {
//                piezaSeleccionada = new Pieza(TipoPieza.LadrilloL, rotacionL);
//                //clickBoton(x, y);
//            }
        }
    }

    /**
     * Rejoj utilizado para indicar el tiempo restante de la partida
     */
    public class Reloj extends JLabel implements Runnable {

        private GregorianCalendar calendario = new GregorianCalendar();
        private int actualiza = 5000;
        private String dia, mes, año, hora, minutos, segundos, milisegundos;
        Thread hilo;

        public Reloj(int x, int y, int width, int height) { //Constructor 
            setBounds(x, y, width, height);
            hilo = new Thread(this);
            hilo.start();
            setForeground(Color.BLUE);
        } //fin constructor 

        @ Override
        public void run() {
            Thread ct = Thread.currentThread();
            while (ct == hilo && !finalizo) {
                try {
                    actualiza();
                    int mesE;
                    mesE = Integer.valueOf(mes) + 1;

                    setText("Tiempo Final: " + minutos + ":" + segundos);

                    Thread.sleep(1000);
                } catch (InterruptedException ex) {
                    System.out.println(ex.getMessage());
                }

            }

        }

        public void actualiza() {

            calendario = faltan();

            dia = calendario.get(Calendar.DATE) > 9 ? "" + calendario.get(Calendar.DATE) : "0" + calendario.get(Calendar.DATE);
            mes = calendario.get(Calendar.MONTH) > 9 ? "" + calendario.get(Calendar.MONTH) : "0" + calendario.get(Calendar.MONTH);
            año = calendario.get(Calendar.YEAR) > 9 ? "" + calendario.get(Calendar.YEAR) : "0" + calendario.get(Calendar.YEAR);
            hora = String.valueOf(calendario.get(Calendar.HOUR_OF_DAY));
            minutos = calendario.get(Calendar.MINUTE) > 9 ? "" + calendario.get(Calendar.MINUTE) : "0" + calendario.get(Calendar.MINUTE);
            segundos = calendario.get(Calendar.SECOND) > 9 ? "" + calendario.get(Calendar.SECOND) : "0" + calendario.get(Calendar.SECOND);
            milisegundos = calendario.get(Calendar.MILLISECOND) > 99 ? "" + calendario.get(Calendar.MILLISECOND) : calendario.get(Calendar.MILLISECOND) > 9 ? "0" + calendario.get(Calendar.MILLISECOND) : "00" + calendario.get(Calendar.MILLISECOND);

        }

        public GregorianCalendar faltan() {
            GregorianCalendar ahora = new GregorianCalendar();
            try {
                long faltan = horaComienzo.getTimeInMillis() - ahora.getInstance().getTimeInMillis();
                if (faltan < 31000) {
                    this.setForeground(Color.RED);
                    this.setFont(new java.awt.Font("Arial Black", 2, 16));//font	Arial Black 14 Italic 
                }
                if (faltan > 0) {
                    ahora.setTimeInMillis(faltan);
                } else {
                    finalizo = true;
                    sistemaEscalera.finalDeLaPartida(finalizo);
                    listarResultadoDeLaPartida();
                    ahora.setTimeInMillis(0);
                    rdbFicha.setEnabled(finalizo);
                    rdbCuadrado.setEnabled(finalizo);
                    rdbRectangulo.setEnabled(finalizo);
                    rdbLadrilloL.setEnabled(finalizo);
                    btnRotar.setEnabled(finalizo);
                    dibujarTablero();
                    dibujarCuadrado();

                    //JOptionPane.showMessageDialog(null, resultado, "Finalizo el tiempo de juego", JOptionPane.ERROR_MESSAGE);
                }
            } catch (Exception ex) {
                JOptionPane.showMessageDialog(null, ex.getMessage(), "Error en tiempo de partida", JOptionPane.ERROR_MESSAGE);
            }
            return ahora;
        }
    }

    @SuppressWarnings("unchecked")
    // <editor-fold defaultstate="collapsed" desc="Generated Code">//GEN-BEGIN:initComponents
    private void initComponents() {

        jPanel1 = new javax.swing.JPanel();
        jMenu3 = new javax.swing.JMenu();
        piezas = new javax.swing.ButtonGroup();
        panelJuego = new javax.swing.JPanel();
        panelColumnas = new javax.swing.JPanel();
        panelFilas = new javax.swing.JPanel();
        btnRotar = new javax.swing.JButton();
        panelLadrillo = new javax.swing.JPanel();
        lstJugadas = new java.awt.List();
        panelTipoPieza = new javax.swing.JPanel();
        rdbCuadrado = new javax.swing.JRadioButton();
        rdbRectangulo = new javax.swing.JRadioButton();
        rdbLadrilloL = new javax.swing.JRadioButton();
        rdbFicha = new javax.swing.JRadioButton();
        chkNiveles = new javax.swing.JCheckBox();
        panelAccionesFicha = new javax.swing.JPanel();
        rdbRetirar = new javax.swing.JRadioButton();
        rdbMover = new javax.swing.JRadioButton();
        btnAplicarAccionFicha = new javax.swing.JButton();
        btnCancelar = new javax.swing.JButton();
        menuBarra = new javax.swing.JMenuBar();
        menuAbandonar = new javax.swing.JMenu();
        menuGuardarJugadas = new javax.swing.JMenu();

        javax.swing.GroupLayout jPanel1Layout = new javax.swing.GroupLayout(jPanel1);
        jPanel1.setLayout(jPanel1Layout);
        jPanel1Layout.setHorizontalGroup(
            jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGap(0, 100, Short.MAX_VALUE)
        );
        jPanel1Layout.setVerticalGroup(
            jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGap(0, 100, Short.MAX_VALUE)
        );

        jMenu3.setText("jMenu3");

        setClosable(true);
        setMaximizable(true);
        setResizable(true);
        setMinimumSize(new java.awt.Dimension(692, 760));
        setPreferredSize(new java.awt.Dimension(890, 835));
        addInternalFrameListener(new javax.swing.event.InternalFrameListener() {
            public void internalFrameClosed(javax.swing.event.InternalFrameEvent evt) {
            }
            public void internalFrameClosing(javax.swing.event.InternalFrameEvent evt) {
                formInternalFrameClosing(evt);
            }
            public void internalFrameOpened(javax.swing.event.InternalFrameEvent evt) {
            }
            public void internalFrameActivated(javax.swing.event.InternalFrameEvent evt) {
            }
            public void internalFrameDeactivated(javax.swing.event.InternalFrameEvent evt) {
            }
            public void internalFrameDeiconified(javax.swing.event.InternalFrameEvent evt) {
            }
            public void internalFrameIconified(javax.swing.event.InternalFrameEvent evt) {
            }
        });
        getContentPane().setLayout(null);

        panelJuego.setBorder(new javax.swing.border.SoftBevelBorder(javax.swing.border.BevelBorder.RAISED));

        javax.swing.GroupLayout panelJuegoLayout = new javax.swing.GroupLayout(panelJuego);
        panelJuego.setLayout(panelJuegoLayout);
        panelJuegoLayout.setHorizontalGroup(
            panelJuegoLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGap(0, 594, Short.MAX_VALUE)
        );
        panelJuegoLayout.setVerticalGroup(
            panelJuegoLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGap(0, 594, Short.MAX_VALUE)
        );

        getContentPane().add(panelJuego);
        panelJuego.setBounds(250, 170, 600, 600);

        javax.swing.GroupLayout panelColumnasLayout = new javax.swing.GroupLayout(panelColumnas);
        panelColumnas.setLayout(panelColumnasLayout);
        panelColumnasLayout.setHorizontalGroup(
            panelColumnasLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGap(0, 600, Short.MAX_VALUE)
        );
        panelColumnasLayout.setVerticalGroup(
            panelColumnasLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGap(0, 20, Short.MAX_VALUE)
        );

        getContentPane().add(panelColumnas);
        panelColumnas.setBounds(250, 150, 600, 20);

        javax.swing.GroupLayout panelFilasLayout = new javax.swing.GroupLayout(panelFilas);
        panelFilas.setLayout(panelFilasLayout);
        panelFilasLayout.setHorizontalGroup(
            panelFilasLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGap(0, 20, Short.MAX_VALUE)
        );
        panelFilasLayout.setVerticalGroup(
            panelFilasLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGap(0, 600, Short.MAX_VALUE)
        );

        getContentPane().add(panelFilas);
        panelFilas.setBounds(230, 170, 20, 600);

        btnRotar.setIcon(new javax.swing.ImageIcon(getClass().getResource("/escaleras/pkginterface/Recursos/transform_rotate_90.png"))); // NOI18N
        btnRotar.setToolTipText("Rotar 90° las Piezas");
        getContentPane().add(btnRotar);
        btnRotar.setBounds(30, 310, 80, 80);

        panelLadrillo.setBorder(javax.swing.BorderFactory.createBevelBorder(javax.swing.border.BevelBorder.RAISED));
        panelLadrillo.setMinimumSize(new java.awt.Dimension(160, 160));
        panelLadrillo.setPreferredSize(new java.awt.Dimension(160, 160));
        panelLadrillo.setLayout(null);
        getContentPane().add(panelLadrillo);
        panelLadrillo.setBounds(30, 400, 160, 160);

        lstJugadas.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                lstJugadasActionPerformed(evt);
            }
        });
        getContentPane().add(lstJugadas);
        lstJugadas.setBounds(20, 30, 640, 110);

        rdbCuadrado.setText("Cuadrado");

        rdbRectangulo.setText("Rectangulo");

        rdbLadrilloL.setText("Ladrillo L");

        rdbFicha.setText("Ficha");

        chkNiveles.setText("Mostrar Niveles");
        chkNiveles.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                chkNivelesActionPerformed(evt);
            }
        });

        javax.swing.GroupLayout panelTipoPiezaLayout = new javax.swing.GroupLayout(panelTipoPieza);
        panelTipoPieza.setLayout(panelTipoPiezaLayout);
        panelTipoPiezaLayout.setHorizontalGroup(
            panelTipoPiezaLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(panelTipoPiezaLayout.createSequentialGroup()
                .addContainerGap()
                .addGroup(panelTipoPiezaLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                    .addComponent(rdbCuadrado)
                    .addComponent(rdbRectangulo)
                    .addComponent(rdbLadrilloL)
                    .addComponent(rdbFicha)
                    .addComponent(chkNiveles))
                .addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
        );
        panelTipoPiezaLayout.setVerticalGroup(
            panelTipoPiezaLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, panelTipoPiezaLayout.createSequentialGroup()
                .addContainerGap()
                .addComponent(chkNiveles)
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                .addComponent(rdbFicha)
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                .addComponent(rdbCuadrado)
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                .addComponent(rdbRectangulo)
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                .addComponent(rdbLadrilloL)
                .addGap(24, 24, 24))
        );

        getContentPane().add(panelTipoPieza);
        panelTipoPieza.setBounds(10, 150, 110, 140);

        rdbRetirar.setText("Retirar");

        rdbMover.setText("Mover");

        btnAplicarAccionFicha.setText("Aplicar");
        btnAplicarAccionFicha.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                btnAplicarAccionFichaActionPerformed(evt);
            }
        });

        btnCancelar.setText("Cancelar");
        btnCancelar.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                btnCancelarActionPerformed(evt);
            }
        });

        javax.swing.GroupLayout panelAccionesFichaLayout = new javax.swing.GroupLayout(panelAccionesFicha);
        panelAccionesFicha.setLayout(panelAccionesFichaLayout);
        panelAccionesFichaLayout.setHorizontalGroup(
            panelAccionesFichaLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(panelAccionesFichaLayout.createSequentialGroup()
                .addContainerGap()
                .addGroup(panelAccionesFichaLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                    .addComponent(btnAplicarAccionFicha, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                    .addGroup(panelAccionesFichaLayout.createSequentialGroup()
                        .addGroup(panelAccionesFichaLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                            .addComponent(rdbMover)
                            .addComponent(rdbRetirar))
                        .addGap(0, 0, Short.MAX_VALUE))
                    .addComponent(btnCancelar, javax.swing.GroupLayout.DEFAULT_SIZE, 76, Short.MAX_VALUE))
                .addGap(14, 14, 14))
        );
        panelAccionesFichaLayout.setVerticalGroup(
            panelAccionesFichaLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(panelAccionesFichaLayout.createSequentialGroup()
                .addContainerGap()
                .addComponent(rdbRetirar)
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                .addComponent(rdbMover)
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                .addComponent(btnAplicarAccionFicha)
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                .addComponent(btnCancelar)
                .addContainerGap(43, Short.MAX_VALUE))
        );

        getContentPane().add(panelAccionesFicha);
        panelAccionesFicha.setBounds(120, 150, 100, 150);

        menuAbandonar.setText("Abandonar");
        menuAbandonar.addMouseListener(new java.awt.event.MouseAdapter() {
            public void mouseClicked(java.awt.event.MouseEvent evt) {
                menuAbandonarMouseClicked(evt);
            }
        });
        menuBarra.add(menuAbandonar);

        menuGuardarJugadas.setText("Guardar Jugadas");
        menuGuardarJugadas.addMouseListener(new java.awt.event.MouseAdapter() {
            public void mouseClicked(java.awt.event.MouseEvent evt) {
                menuGuardarJugadasMouseClicked(evt);
            }
        });
        menuBarra.add(menuGuardarJugadas);

        setJMenuBar(menuBarra);

        pack();
    }// </editor-fold>//GEN-END:initComponents

    /**
     *
     * @param evt
     */
    private void menuAbandonarMouseClicked(java.awt.event.MouseEvent evt) {//GEN-FIRST:event_menuAbandonarMouseClicked
        // TODO add your handling code here:
        finalizo = abandonar();
        listarResultadoDeLaPartida();
    }//GEN-LAST:event_menuAbandonarMouseClicked

    /**
     *
     * @param evt
     */
    private void menuGuardarJugadasMouseClicked(java.awt.event.MouseEvent evt) {//GEN-FIRST:event_menuGuardarJugadasMouseClicked
        // TODO add your handling code here:
        //Creamos selector de apertura
        try {
            JFileChooser chooser = new JFileChooser();
            chooser.setSelectedFile(new File("Partida.txt"));
            FileNameExtensionFilter filter = new FileNameExtensionFilter("Archivo de Texto", "txt");
            chooser.setFileFilter(filter);
            chooser.setCurrentDirectory(new java.io.File("."));
            //Titulo que llevara la ventana
            chooser.setDialogTitle("Salvar Jugadas");
            chooser.setDialogType(javax.swing.JFileChooser.SAVE_DIALOG);
            //Elegiremos archivos del directorio
            chooser.setFileSelectionMode(JFileChooser.FILES_AND_DIRECTORIES);
            chooser.setAcceptAllFileFilterUsed(false);
            //Si seleccionamos algún archivo retornaremos su directorio
            int userSelection = chooser.showSaveDialog(this);// Da un entero
            // Si apretamos en aceptar ocurrirá esto

            if (userSelection == JFileChooser.APPROVE_OPTION) {
                File fileToSave = chooser.getSelectedFile();
                String nombreArchivo = fileToSave.getAbsolutePath();
                if (!fileToSave.getName().contains(".")) {
                    nombreArchivo += ".txt";
                }
                listarJugadasDeLaPartida(nombreArchivo);
                System.out.println("Salvar como: " + nombreArchivo);
                JOptionPane.showMessageDialog(null, "Se guardaron las jugadas en " + nombreArchivo + ".", "Jugadas Guardadas", JOptionPane.PLAIN_MESSAGE);
            }
        } catch (Exception ex) {
            JOptionPane.showMessageDialog(null, ex.getMessage(), "Error de jugada", JOptionPane.ERROR_MESSAGE);
        }

    }//GEN-LAST:event_menuGuardarJugadasMouseClicked

    /**
     *
     * @param evt
     */
    private void chkNivelesActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_chkNivelesActionPerformed
        // TODO add your handling code here:  
        indicarNiveles(chkNiveles.isSelected());
    }//GEN-LAST:event_chkNivelesActionPerformed

    /**
     *
     * @param evt
     */
    private void btnAplicarAccionFichaActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_btnAplicarAccionFichaActionPerformed
        // TODO add your handling code here:
        try {
            if (!finalizo) {
                if (rdbMover.isSelected()) {
                    if (listaMovimientos != null) {
                        Coordenada[] coordenadas = new Coordenada[listaMovimientos.size()];
                        listaMovimientos.toArray(coordenadas);
                        moverFicha(coordenadas);
                        listaMovimientos = null;
                        estadoDeJuego();
                    }
                }
                if (rdbRetirar.isSelected()) {
                    retirarFicha();
                    estadoDeJuego();
                }
                fichaEnTablero = null;
                panelAccionesFicha.setVisible(false);
            }
        } catch (Exception ex) {
            JOptionPane.showMessageDialog(null, ex.getMessage(), "Error de jugada", JOptionPane.ERROR_MESSAGE);
        }
    }//GEN-LAST:event_btnAplicarAccionFichaActionPerformed

    /**
     *
     * @param evt
     */
    private void btnCancelarActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_btnCancelarActionPerformed
        // TODO add your handling code here:

        try {

            for (Component componente : panelTipoPieza.getComponents()) {
                if (!componente.equals(chkNiveles)) {
                    componente.setEnabled(true);
                }
            }
            listaMovimientos = null;
            fichaEnTablero = null;
            panelAccionesFicha.setVisible(false);
            dibujarTablero();
        } catch (Exception ex) {
            JOptionPane.showMessageDialog(null, ex.getMessage(), "Error de jugada", JOptionPane.ERROR_MESSAGE);
        }
    }//GEN-LAST:event_btnCancelarActionPerformed

    private void lstJugadasActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_lstJugadasActionPerformed
        // TODO add your handling code here:
    }//GEN-LAST:event_lstJugadasActionPerformed

    private void formInternalFrameClosing(javax.swing.event.InternalFrameEvent evt) {//GEN-FIRST:event_formInternalFrameClosing
        // TODO add your handling code here:
        finalizo = abandonar();
        listarResultadoDeLaPartida();
    }//GEN-LAST:event_formInternalFrameClosing

    // Variables declaration - do not modify//GEN-BEGIN:variables
    private javax.swing.JButton btnAplicarAccionFicha;
    private javax.swing.JButton btnCancelar;
    private javax.swing.JButton btnRotar;
    private javax.swing.JCheckBox chkNiveles;
    private javax.swing.JMenu jMenu3;
    private javax.swing.JPanel jPanel1;
    private java.awt.List lstJugadas;
    private javax.swing.JMenu menuAbandonar;
    private javax.swing.JMenuBar menuBarra;
    private javax.swing.JMenu menuGuardarJugadas;
    private javax.swing.JPanel panelAccionesFicha;
    private javax.swing.JPanel panelColumnas;
    private javax.swing.JPanel panelFilas;
    private javax.swing.JPanel panelJuego;
    private javax.swing.JPanel panelLadrillo;
    private javax.swing.JPanel panelTipoPieza;
    private javax.swing.ButtonGroup piezas;
    private javax.swing.JRadioButton rdbCuadrado;
    private javax.swing.JRadioButton rdbFicha;
    private javax.swing.JRadioButton rdbLadrilloL;
    private javax.swing.JRadioButton rdbMover;
    private javax.swing.JRadioButton rdbRectangulo;
    private javax.swing.JRadioButton rdbRetirar;
    // End of variables declaration//GEN-END:variables
}
